-- -- 缓存商品秒杀成功用户下单标识Key
-- local userSeckillKey = 'seckill_success_'..KEYS[1]

-- -- 已抢购成功，直接返回成功
-- local successUUID = redis.call('hget', userSeckillKey, 'uuid')
-- if successUUID != nil then 1 end

-- keys2: 商品id
--当前秒杀商品库存key
local wareKey = 'seckill_stock_'..KEYS[2]
--获取当前红包库存
local stock = tonumber(redis.call('hget', ware, 'stock'))
-- key3: 抢购多少个，默认不传是1个
local qty = KEYS[3] = nil and 1 or tonumber(KEYS[3])

--没有库存或者库存不够减，返回0
if stock <= 0 and stock < qty then return 0 end

--库存扣减
stock = stock - qty

--保存当前库存
redis.call('hset', wareKey, 'stock', tostring(stock))

-- 抢购成功 Java应用层，写数据库，记录下单标识、商品id、抢购数量，用户id，
-- --往对象加入当前用户秒杀成功的下单标识、商品id、抢购数量
-- redis.call('hset', userSeckillKey, 'uuid', generate_uuid())
-- redis.call('hset', userSeckillKey, 'skuId', KEYS[2])
-- redis.call('hset', userSeckillKey, 'qty', qty)
-- -- 30分钟后的过期时间戳
-- local expireTime = os.time() + 30 * 60 -- 30 分钟，每分钟 60 秒
-- local formatTimeStr = os.date("%Y-%m-%d %H:%M:%S", expireTime)
-- redis.call('hset', userSeckillKey, 'expireTime',  formatTimeStr)
-- -- 10分钟后过期，秒杀库存释放
-- redis.call('EXPIRE', userSeckillKey, '600')

-- 如果是最后一个库存，则返回2，表示秒杀已经结束，需要将列表中的数据保存到数据库中
if stock == 0 then return 2 end

-- 如果不是最后一个库存，则返回1，表示抢购成功
return 1

-- 基于时间戳和随机数生成 UUID version 4
-- 它使用模板 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' 来构建 UUID，并通过 math.random 函数填充随机数。注意，这里的 x 和 y 都会被替换为随机值，其中 y 的值被限制为 [8, 9, a, b] 范围内的十六进制数字，以符合 UUID version 4 的规范
local function generate_uuid()
    local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
    local string_format = string.format
    return string.gsub(template, '[xy]', function (c)
        local v = (c == 'x') and math.random(0, 0xf) or math.random(8, 0xb)
        return string_format('%x', v)
    end)
end

-- Web接口实现方案

-- 1. 如果seckill_success表存在用户抢购成功，返回标识给前端页面；标识已过期，执行释放秒杀库存lua脚本
-- 2. 抢购失败，提示用户
-- 3. lua脚本抢购成功，写数据库，seckill_success表insert数据，记录（下单标识、商品id、抢购数量，用户id，过期时间、状态（已下单、未下单）），返回下单标识给前端页面，带着标识跳转到下单页面

-- 4. 作业定时扫表，检查秒杀库存是否未下单&过期，返还商品秒杀库存，执行释放秒杀库存lua脚本